import { Request, Response} from "express";
import UserServer from '../server/UserServer'
import { createToken } from '../utils/utils'

class UserController {

  // 登录
  // 表单参数：username，password
  async login(req: Request, res: Response) {
    const form = req.body;
    if (Object.keys(form).length < 2) return res.error("缺少必填参数！");
    const user = await UserServer.findByName(form.username);
    if (!user) return res.error('用户名错误！')
    if (form.password !== user.password) return res.error('密码错误！');
    const token = createToken(form.id)  // 生成 token
    delete user.password;
    res.send({
      code: 200,
      msg: '登录成功！',
      data: user,
      token
    });
  }

  // 注册
  // 表单参数：username，password，is_admin
  async register(req: Request, res: Response) {
    const form = req.body;
    if (Object.keys(form).length < 3) return res.error("缺少必填参数！");
    const user = await UserServer.findByName(form.username);
    if (user) return res.error('用户名已被占用！');
    if (form.is_admin !== 'no' && form.is_admin !== 'is') return res.error('is_admin 必须为is/no');
    const newUser = await UserServer.addUser(form);
    res.send({
      code: 200,
      msg: '注册用户成功！',
    })
  }

  // 修改
  async updateUser(req: Request, res: Response) {
    const form = req.body;
    // 前提检查
    if (!form.id) return res.error('缺少必填参数！');
    const user = await UserServer.findById(form.id);
    if (!user) return res.error('查无此用户！');
    const users = await UserServer.findsByName(form.username)
    // 循环用户数组，移除与表单用户id相同的一项
    users.forEach((item, index) => {
      if (item.id === Number(form.id)) {
        users.splice(index, 1)
      }
    })
    // 如果还存在其他用户，则说明，用户名被占用
    if (users.length >= 1) return res.error('用户名已被占用！');
    // 更新用户信息
    await UserServer.updateUser(form.id, form);    
    const newUser = await UserServer.findById(form.id);
    res.send({
      code: 200,
      msg: '更新用户成功！',
      data: newUser
    })
    
  }

  // 修改密码
  // 参数：id，新密码，确认密码
  async updatePwd(req: Request, res: Response) {
    const form = req.body;
    if (Object.keys(form).length < 3) return res.error("缺少必填参数！");
    if (form.newpassword !== form.checkpassword) return res.error('两次密码不一致！');
    const user = await UserServer.findById(form.id);
    user.password = form.checkpassword;
    UserServer.updateUser(form.id, user);
    res.send({
      code: 200,
      msg: '密码修改成功！'
    });
  }

  // 根据 id 删除用户
  async deleteUser(req: Request, res: Response) {
    const user = await UserServer.findById(req.params.id);
    if (!user) return res.error('查无此用户！')
    const result = await UserServer.deleteUser(req.params.id)
    if(result.affected !== 1) return res.error('删除用户失败！')
    res.send({
      code: 200,
      msg: '删除用户成功！'
    })
  }

  // 根据 id 查找用户
  async findById(req: Request, res: Response) {
    const user = await UserServer.findById(req.params.id)
    if (!user) return res.error('该用户不存在！');
    res.success(user)
  }

  // 根据用户名查找用户，参数：username
  async findByUserName(req: Request, res: Response) {
    const user = await UserServer.findByName(req.body.username);
    if (!user) return res.error('该用户不存在！');
    res.success(user)
  }

  // 根据用户名的关键词查找用户（模糊查找），参数：userkey
  async findByKeyWord(req: Request, res: Response) {
    const user = await UserServer.findByKeyWord(req.body.userkey);
    if (!user) return res.error('查无此用户！');
    res.success(user)
  }

  // 根据 is_admin 查找用户
  async findByIs_Admin(req: Request, res: Response) {
    const user = await UserServer.findByIs_Admin(req.params.isadmin);
    if (!user) return res.error('查无此用户！');
    res.success(user)
  }

  // 查询所有用户
  async findAllUser(req: Request, res: Response) {
    const user = await UserServer.findAllUser()
    res.success(user)
  }

  // 根据用户名、id、是否管理员查询列表数据
  async findUserList(req: Request, res: Response) {
    const {id = '', username = '', is_admin = ''} = req.query
    const user = await UserServer.findUserList({
      id,
      username,
      is_admin
    });
    if (!user) return res.error('查无此用户！');
    res.success(user)
  }
}
export default new UserController()